package slidingWindow;

import java.util.BitSet;

public class BloomFilterExample {
    private BitSet bloomFilter;
    private int filterSize; // 过滤器大小（𝛼位）
    private double falsePositiveRate; // 期望的误报率（𝛽百分比）

    public BloomFilterExample(int filterSize, double falsePositiveRate) {
        this.filterSize = filterSize;
        this.falsePositiveRate = falsePositiveRate;
        this.bloomFilter = new BitSet(filterSize);
    }

    // 初始化布隆过滤器为一个𝛼位的全为0的字符串。
    public void initializeBloomFilter() {
        bloomFilter.clear();
    }

    // 应用一个哈希函数 (𝑤) 并执行按位的“或”操作来更新布隆过滤器。
    public void updateBloomFilter(String keyword) {
        int hash = hashFunction(keyword);
        int index = hash % filterSize;
        bloomFilter.set(index, true);
    }

    // 检查关键词是否可能在集合中（可能存在误报）。
    public boolean mayContain(String keyword) {
        int hash = hashFunction(keyword);
        int index = hash % filterSize;
        return bloomFilter.get(index);
    }

    // 哈希函数（根据您的数据替换为适当的哈希函数）
    private int hashFunction(String keyword) {
        // 实现一个将关键词转换为整数的哈希函数。
        // 这是一个简化的示例；实际应用中需要使用良好的哈希函数。
        return keyword.hashCode();
    }

    public static void main(String[] args) {
        int filterSize = 8000;  // 𝛼，过滤器大小（位）
        double falsePositiveRate = 0.10;  // 𝛽，期望的误报率（10%）

        BloomFilterExample bloomFilter = new BloomFilterExample(filterSize, falsePositiveRate);

        // 初始化布隆过滤器
        bloomFilter.initializeBloomFilter();

        // 使用高频关键词更新过滤器
        String[] highFrequencyKeywords = {"关键词1", "关键词2", "关键词3"};
        for (String keyword : highFrequencyKeywords) {
            bloomFilter.updateBloomFilter(keyword);
        }

        // 检查关键词是否可能在集合中（可能存在误报）
        String queryKeyword = "关键1";
        boolean isLikelyInSet = bloomFilter.mayContain(queryKeyword);
        System.out.println("'" + queryKeyword + "' 是否可能在集合中？ " + isLikelyInSet);
    }
}
